<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>js正则表达式之修正符</title>
</head>
<body>
  <ul>
    <li>使用g可匹配所有满足条件的字符，否则只能匹配一次即结束</li>
    <li>使用i可匹配不区分大小写的字符，使用g和i可匹配所有满足条件不区分大小写的字符</li>
    <li>使用s将字符串视为单行，换行符作为普通字符进行匹配</li>
    <li>使用m将字符串视为多行，每行作为一个单元单独进行匹配</li>
    <li>使用u将能匹配指定语言(如中文,英文)的字符(或标点，特殊字符)，必须要结合\p和gu才有效果</li>
    <li>使用y将匹配所有满足条件的字符，但与g不同的是，y使用exec和lastIndex检测，匹配完即结束(用于长文档搜索，较少使用)；而g会一直匹配的字符串的结尾</li>
  </ul>
  <script>
    console.log('Miracle He'.match(/e/))       // 只能匹配Miracle中的e
    console.log('Miracle He'.match(/e/g))      // ["e", "e"]
    console.log('Miracle HE'.match(/e/g))      // 只能匹配Miracle中的e
    console.log('Miracle HE'.match(/e/gi))     // ["e", "E"]
    console.log('Miracle\nHe'.match(/.+/))     // "Miracle"
    console.log('Miracle\nHe'.match(/.+/s))    // "Miracle↵He"
    console.log('Miracle\nHe'.match(/.+/gs))   // ["Miracle↵He"]
    // [{name:'js',price:3000}]
    const str1 = `
      #1 js, 3000 #
      #2 ts, 5000 #
      #3 css # github
      #4 es, 2000 #
    `
    const items = str1.match(/^\s*#\d+\s+.+\s*#$/gm).map(item => {
      item = item.replace(/\s*#\d\s+/, '').replace(/[\s#]/g, '')
      const [name, price] = item.split(',')
      return { name, price }
    })
    console.log(items)
    console.log(JSON.stringify(items, null, 2))
    const str2 = 'Miracle&1984He08.学习JS，加油！'
    // 匹配所有的字母(含中文和英文)
    console.log(str2.match(/\p{L}/gu))         // ["M", "i", "r", "a", "c", "l", "e", "H", "e", "学", "习", "J", "S", "加", "油"]
    // 匹配所有的标点符号(含特殊符号)
    console.log(str2.match(/\p{P}/gu))         // ["&", ".", "，", "！"]
    // 匹配所有的中文字母
    console.log(str2.match(/\p{sc=Han}/gu))    // ["学", "习", "加", "油"]
    // 匹配所有的电话号码
    const str3 = '联系方式：010-66666666，028-88888888，020-99999999\n请各位随时咨询'
    // 使用g匹配(一直检测到字符串末尾)
    console.log(str3.match(/\d{3}-\d{7,8}/g))  // ["010-66666666", "028-88888888", "020-99999999"]
    // 使用y匹配(检测结束即停止)
    const reg = /(\d{3}-\d{7,8})，?/y
    reg.lastIndex = 5                          // 指定开始搜索的位置
    const tels = []
    let res
    while ((res = reg.exec(str3))) {
      // console.log(res)
      tels.push(res[1])
    }
    console.log(tels)                          // ["010-66666666", "028-88888888", "020-99999999"]
  </script>
</body>
</html>